﻿using DIF;
using LSG;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//Dependency Inversion fout
namespace DIF
{
    interface ILogger
    {
        void Handle(string error);
    }

    class FileLogger : ILogger
    {
        public void Handle(string error)
        {
            System.IO.File.WriteAllText(@"c:\Error.txt", error);
        }
    }

    class EverViewerLogger : ILogger
    {
        public void Handle(string error)
        {
            // log errors to event viewer
        }
    }

    class EmailLogger : ILogger
    {
        public void Handle(string error)
        {
            // send errors in email
        }
    }

    class Customer : IDiscount, IDatabase
    {
        private ILogger obj;

        public virtual void Add(int Exhandle)
        {
            try
            {
                // Database code goes here
            }
            catch (Exception ex)
            {
                if (Exhandle == 1)
                {
                    obj = new FileLogger();
                }
                else
                {
                    obj = new EmailLogger();
                }

                obj.Handle(ex.Message.ToString());
            }
        }
    }
}

//Dependency Inversion goed
namespace DIG
{
    class Customer : IDiscount, IDatabase
    {
        private ILogger obj;
        public Customer(ILogger i)
        {
            obj = i;
        }
    }

    /// <summary>
    /// De logica van het kiezen van een logger wordt niet uitgevoerd in de customer zelf
    /// maar dit wordt extern uitgevoerd (want dit is niet te taak van de customer).
    /// </summary>
    class Main
    {
        public void Run()
        {
            IDatabase i = new Customer(new EmailLogger());
        }
    }
}